package PL.pract1;

import java.io.FileInputStream;
import java.io.FileNotFoundException;
import java.io.FileWriter;
import java.io.IOException;
import java.io.PrintWriter;

import nu.xom.Builder;
import nu.xom.Document;
import nu.xom.Element;
import nu.xom.Elements;
import nu.xom.ParsingException;
import nu.xom.ValidityException;


public class App 
{
   public App(){}
   
   public static Invitacion LeerFichXML(String NomFich) throws ValidityException, FileNotFoundException, ParsingException, IOException
    {
    	//Creamos un objeto invitacion
    	Invitacion inv= new Invitacion();
    	//Creamos el builder XOM  
    	Builder builder = new Builder();  
    	//Construimos el arbol DOM a partir del fichero xml  
    	Document doc = builder.build(new FileInputStream(NomFich));
    	//Obtenemos la etiqueta raíz  
        Element raiz = doc.getRootElement();
        ExplorarEtiquetas(raiz, inv);
        return inv;
      }
	    
   public static void ExplorarEtiquetas(Element raiz, Invitacion inv){
	   // Recorremos los hijos de la etiqueta raíz  
	   Elements hijosRaiz = raiz.getChildElements();  
	   for(int i=0;i<hijosRaiz.size();i++){  
		   Element hijo = hijosRaiz.get(i);       
		   // Obtenemos las etiquetas y su contenido y las almacenamos en el objeto invitacion.
		   String etiqueta=hijo.getLocalName();
		   if (etiqueta=="to"){	
			   inv.SetTo(hijo.getValue());
		   }
		   else if (etiqueta=="date"){	
			   inv.SetDate(hijo.getValue());
		   }
		   else if (etiqueta=="where"){	
			   inv.SetWhere(hijo.getValue());
		   }
		   else if (etiqueta=="why"){	
			   inv.SetWhy(hijo.getValue());
		   }
		   else if (etiqueta=="body"){	
			   inv.SetBody(hijo.getValue());
		   }
		   else if (etiqueta=="signature"){	
			   inv.SetSignature(hijo.getValue());
		   }
		   else if (etiqueta=="emph"){
			   inv.SetBody(inv.GetBody().replaceAll(hijo.getValue(),"<EM>"+hijo.getValue()+"</EM>"));
		   }
		   ExplorarEtiquetas(hijo, inv);
   		}
   	}  
   
   
   public static void EscribirFichHTML(Invitacion inv, String NomFich) throws IOException{
	   //creamos un fichero
	   FileWriter fichero = new FileWriter(NomFich);
       PrintWriter pw = new PrintWriter(fichero);
       
       //escribimos en el fichero html la invitacion requerida
       pw.println("<HTML>" +
       			  "<HEAD>" +
       			  "<TITLE>Invitation (sgmlpl/CSS formatting)</TITLE>" +
       			  "<LINK href=\"invit.css\" rel=\"style-sheet\" type=\"text/css\">" +
       			  "</HEAD>" +
       			  "<BODY>" +
       			  "<H1>INVITATION</H1>" +
       			  "<P><TABLE>" +
       			  "<TBODY>" +
       			  "<TR><TD class=\"front\">To:</TD><TD>");
       pw.println(inv.GetTo());
       pw.println("</TD></TR><TR><TD class=\"front\">When:</TD><TD>");
       pw.println(inv.GetDate());
       pw.println("</TD></TR><TR><TD class=\"front\">Venue:</TD><TD>");
       pw.println(inv.GetWhere());
       pw.println("</TD></TR><TR><TD class=\"front\">Occasion:</TD><TD>");
       pw.println(inv.GetWhy());
       pw.println("</TD></TR>" +
       			  "</TBODY>" +
       			  "</TABLE>" +
       			  "<P>");
       inv.SetBody(inv.GetBody().replaceAll("\\n","</P><P>"));
       pw.println(inv.GetBody());
       pw.println("</P><P CLASS=\"signature\">");
       pw.println(inv.GetSignature());
       pw.println("</P></BODY></HTML>");
       
       //cerramos el fichero
       if (null != fichero){
           fichero.close();
           System.out.println( "Conversión del archivo realizada con éxito" );

       }
   }
   
   
   	//PROGRAMA PRINCIPAL
    public static void main( String[] args ) throws ValidityException, FileNotFoundException, ParsingException, IOException
    {
    	Invitacion inv = LeerFichXML("fichero.xml");
    	EscribirFichHTML(inv,"fichero.html");
    }
}
